// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_CAST_TEST_SKEWED_TICK_CLOCK_H_
#define MEDIA_CAST_TEST_SKEWED_TICK_CLOCK_H_

#include "base/macros.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"

namespace media {
namespace cast {
    namespace test {

        // Wraps a base::TickClock, and lets you change the speed and offset
        // of time compared to the wrapped clock. See SetSkew for how usage.
        class SkewedTickClock : public base::TickClock {
        public:
            // Does not take ownership of |clock_|.
            explicit SkewedTickClock(base::TickClock* clock_);
            // |skew| > 1.0 means clock runs faster.
            // |offset| > 0 means clock returns times from the future.
            // Note, |offset| is cumulative.
            // Also note that changing the skew will never make the clock
            // jump forwards or backwards, only changing the offset will
            // do that.
            void SetSkew(double skew, base::TimeDelta offset);
            base::TimeTicks NowTicks() final;

        private:
            base::TimeTicks SkewTicks(base::TimeTicks now);
            base::TickClock* clock_; // Not owned.
            double skew_;
            base::TimeTicks last_skew_set_time_;
            base::TimeTicks skew_clock_at_last_set_;

            DISALLOW_COPY_AND_ASSIGN(SkewedTickClock);
        };

    } // namespace test
} // namespace cast
} // namespace media

#endif // MEDIA_CAST_TEST_SKEWED_TICK_CLOCK_H_
